package com.example.design.b.proxy2.cglib;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理方法处理器
 * 在这里添加实际的业务逻辑
 */
public class CommonMethodInterceptor implements MethodInterceptor {

    /**
     * 需要被代理角色的接口
     */
    private final Object iProxy;

    /**
     * 构造方法添加被代理对象
     *
     * @param iProxy 被代理对象
     */
    public CommonMethodInterceptor(Object iProxy) {
        this.iProxy = iProxy;
    }

    /**
     * 代理对象的方法预处理
     *
     * @param proxy  代理对象
     * @param method 被代理对象的方法
     *               执行哪个方法, 那个方法就会被代理
     *               多个方法的话会依次经过这里的invoke进行处理(比如 IPerson.drink 方法)
     * @param args   被代理对象的方法参数
     *
     * @return 被代理对象的执行方法后的返回值
     *
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        preHandle();
        // 执行被代理的方法
        Object obj = methodProxy.invoke(iProxy, args); // 被代理方法的返回值
        postHandle();
        return obj;
    }

    /**
     * 前置处理
     */
    public void preHandle() {
        System.out.println("洗手");
    }

    /**
     * 后置处理
     */
    public void postHandle() {
        System.out.println("刷碗洗盘子");
    }
}
